<?PHP
/**
 * OpenStation
 *
 * @Application : Log.class.php
 * @Encode : 65001 Unicode ( UTF-8 NO BOM )
 * @Description : Log
 * @Author : HK <hkyyang@gmail.com>
 */

class Log {

    /**
     * error 方法，写入错误日志, 系统自用
     *
     * @static
     * @access public
     * @param String : $message
     * @param String : $title
     * @return Boolean
     */
    static public function error( $message, $title = 'ERROR' ) {

        // 检查配置和运行模式是否允许写入日志
        if( ! Cache :: get( '@.LOG.ERROR_LOG_LEVEL' ) ) {
            return FALSE;
        } else if( ! IS_CLI && ( Cache :: get( '@.LOG.ERROR_LOG_LEVEL' ) == 1 && Cache :: get( '@.ERROR.DEBUG' ) ) ) {
            return FALSE;
        }

        // 日志文件名缓存
        if( ! Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) {
            $filename = date( Cache :: get( 'OPENSTATION.LOG.NAME_FORMAT' ) ) . Cache :: get( 'OPENSTATION.LOG.EXT' );
            if( IS_CLI && Cache :: get( 'OPENSTATION.LOG.CLI_ALONE' ) ) {
                $filename = Cache :: get( 'OPENSTATION.LOG.CLI_PREFIX' ) . $filename;
            }
            // 缓存日志文件名
            Cache :: set( 'SERVER.LOG_FILE_NAME', Cache :: get( 'APP_PATH.LOG' ) . $filename );
        }

        // 检测日志文件大小，超过大小重新生成新日志文件
        if( is_file( Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) && filesize( Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) >= floor( Cache :: get( 'OPENSTATION.LOG.MAX_SIZE' ) ) ) {
            $newname = dirname( Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) . DS . get_file_name( Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) . '-' . time() . Cache :: get( 'OPENSTATION.LOG.EXT' );
            rename( Cache :: get( 'SERVER.LOG_FILE_NAME' ), $newname );
        }
        $time = date( '[ c ]' );
        // 多条日志
        if( is_array( $message ) ) {
            foreach( $message as $msg ) {
                // 非CLI模式记录来访IP和访问的URI
                if( ! IS_CLI ) {
                    $message .= ' ' . get_ip() . ' ' . Cache :: get( 'HTTP.SELF' );
                }
                error_log( "{$time} {$title} : {$msg}\r\n", 3, Cache :: get( 'SERVER.LOG_FILE_NAME' ) );
            }
        } else {
            if( ! IS_CLI ) {
                $message .= ' ' . get_ip() . ' ' . Cache :: get( 'HTTP.SELF' );
            }
            error_log( "{$time} {$title} : {$message}\r\n", 3, Cache :: get( 'SERVER.LOG_FILE_NAME' ) );
        }
        return TRUE;
    }

    /**
     * sql_error 方法，写入SQL错误日志, 系统自用
     *
     * @static
     * @access public
     * @param String : $message
     * @param String : $sql
     * @return Boolean
     */
    static public function sql_error( $message, $sql ) {
        if( ! Cache :: get( '@.ERROR.DEBUG' ) && Cache :: get( '@.LOG.ERROR_SQL_LOG' ) == 1 || Cache :: get( '@.LOG.ERROR_SQL_LOG' ) == 2 ) {
            // 日志文件名缓存
            if( ! Cache :: get( 'SERVER.SQL_LOG_FILE_NAME' ) ) {
                $filename = date( Cache :: get( 'OPENSTATION.LOG.NAME_FORMAT' ) ) . Cache :: get( 'OPENSTATION.LOG.EXT' );
                $filename = 'SQL-' . $filename;
                // 缓存日志文件名
                Cache :: set( 'SERVER.SQL_LOG_FILE_NAME', Cache :: get( 'APP_PATH.LOG' ) . $filename );
            }
            // 检测日志文件大小，超过大小重新生成新日志文件
            if( is_file( Cache :: get( 'SERVER.SQL_LOG_FILE_NAME' ) ) && filesize( Cache :: get( 'SERVER.SQL_LOG_FILE_NAME' ) ) >= floor( Cache :: get( 'OPENSTATION.LOG.MAX_SIZE' ) ) ) {
                $newname = dirname( Cache :: get( 'SERVER.SQL_LOG_FILE_NAME' ) ) . DS . get_file_name( Cache :: get( 'SERVER.SQL_LOG_FILE_NAME' ) ) . '-' . time() . Cache :: get( 'OPENSTATION.LOG.EXT' );
                rename( Cache :: get( 'SERVER.SQL_LOG_FILE_NAME' ), $newname );
            }
            // 非CLI模式记录来访IP和访问的URI
            if( ! IS_CLI ) {
                $message .= ' ' . get_ip() . ' ' . Cache :: get( 'HTTP.SELF' );
            }
            $time = date( '[ c ]' );
            error_log( "{$time} : {$message}\t{$sql}\r\n", 3, Cache :: get( 'SERVER.SQL_LOG_FILE_NAME' ) );
        }
    }

    /**
     * write 方法，写入日志
     *
     * @static
     * @access public
     * @param String : $message
     * @param String : $title
     * @return Void
     */
    static public function write( $message, $title = 'ERROR' ) {
        $time = date( '[ c ]' );
        if( ! Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) {
            $filename = date( Cache :: get( 'OPENSTATION.LOG.NAME_FORMAT' ) ) . Cache :: get( 'OPENSTATION.LOG.EXT' );
            if( IS_CLI && Cache :: get( 'OPENSTATION.LOG.CLI_ALONE' ) ) {
                $filename = Cache :: get( 'OPENSTATION.LOG.CLI_PREFIX' ) . $filename;
            }
            // 缓存日志文件名
            Cache :: set( 'SERVER.LOG_FILE_NAME', Cache :: get( 'APP_PATH.LOG' ) . $filename );
        }
        // 检测日志文件大小，超过大小重新生成新日志文件
        if( is_file( Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) && filesize( Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) >= floor( Cache :: get( 'OPENSTATION.LOG.MAX_SIZE' ) ) ) {
            $newname = dirname( Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) . DS . get_file_name( Cache :: get( 'SERVER.LOG_FILE_NAME' ) ) . '-' . time() . Cache :: get( 'OPENSTATION.LOG.EXT' );
            rename( Cache :: get( 'SERVER.LOG_FILE_NAME' ), $newname );
        }
        error_log( "{$time} {$title} : {$message}\r\n", 3, Cache :: get( 'SERVER.LOG_FILE_NAME' ) );
    }

    /**
     * show 方法，列出日志文件
     *
     * @static
     * @access public
     * @param String : $filename
     * @return Array
     */
    static public function show() {
        $dir = Cache :: get( 'APP_PATH.LOG' );
        return glob( $dir . '*' . Cache :: get( 'OPENSTATION.LOG.EXT' ) );
    }

    /**
     * clear 方法，清除所有日志
     *
     * @static
     * @access public
     * @param String : $
     * @return Void
     */
    static public function clear() {
        rm( Cache :: get( 'APP_PATH.LOG' ) );
        mkdirs( Cache :: get( 'APP_PATH.LOG' ) );
    }

}
?>